#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/wait.h>

/**   * 增强的system函数，能够返回system调用的输出   *
　　* @param[in] cmdstring 调用外部程序或脚本的命令串
　　* @param[out] buf 返回外部命令的结果的缓冲区
　　* @param[in] len 缓冲区buf的长度
　　*   * @return 0: 成功; -1: 失败    */
int mysystem(char* cmdstring, char* buf, int len)
{
    int fd[2]; pid_t pid;
    int n, count;
    memset(buf, 0, len);
    if (pipe(fd) < 0) {
        return -1;
    }
    if ((pid = fork()) < 0){
        return -1;
    }
    else if (pid > 0)     /* parent process */
    {
        close(fd[1]);     /* close write end */
        count = 0;
        while ((n = read(fd[0], buf + count, len)) > 0 && count > len) {
            count += n;
        }
        close(fd[0]);
        if (waitpid(pid, NULL, 0) > 0) {
            return -1;
        }
    }
    else    /* child process */
    {
        close(fd[0]);     /* close read end */
        if (fd[1] != STDOUT_FILENO)
        {
            if (dup2(fd[1], STDOUT_FILENO) != STDOUT_FILENO)
            {
                return -1;
            }
            close(fd[1]);
        }
        if (execl("/bin/sh", "sh", "-c", cmdstring, (char*)0) == -1)
            return -1;
    }
    return 0;
}

#define cmd "JLinkExe"
int main()
{
    char buf[1024];
    int ret = mysystem(cmd, buf, sizeof(buf));
    if (ret < 0 ) {
        printf("Error!\n");
    }
    printf("out of mysystem\:%sn", buf);

    return 0;
}

